/**
 * 算式抽象类
 * 定义所有算式共有的属性和行为
 */
public abstract class AbstractCalculation {
    // 两个操作数
    protected int operand1;
    protected int operand2;
    // 运算符
    protected char operator;
    // 计算结果
    protected int result;
    
    /**
     * 构造函数
     * @param operand1 第一个操作数
     * @param operand2 第二个操作数
     * @param operator 运算符
     */
    public AbstractCalculation(int operand1, int operand2, char operator) {
        this.operand1 = operand1;
        this.operand2 = operand2;
        this.operator = operator;
        this.result = calculateResult(); // 构造时自动计算结果
    }
    
    /**
     * 抽象方法：计算结果
     * 由子类实现具体的计算逻辑
     * @return 计算结果
     */
    protected abstract int calculateResult();
    
    /**
     * 验证答案是否正确
     * @param answer 用户提供的答案
     * @return 是否正确
     */
    public boolean checkAnswer(int answer) {
        return this.result == answer;
    }
    
    /**
     * 获取算式字符串（不包含结果）
     * @return 算式字符串，格式如 "3 + 5"
     */
    public String getExpression() {
        return operand1 + " " + operator + " " + operand2;
    }
    
    /**
     * 获取带结果的算式字符串
     * @return 带结果的算式字符串，格式如 "3 + 5 = 8"
     */
    public String getFullExpression() {
        return getExpression() + " = " + result;
    }
    
    /**
     * 获取第一个操作数
     * @return 第一个操作数
     */
    public int getOperand1() {
        return operand1;
    }
    
    /**
     * 获取第二个操作数
     * @return 第二个操作数
     */
    public int getOperand2() {
        return operand2;
    }
    
    /**
     * 获取运算符
     * @return 运算符
     */
    public char getOperator() {
        return operator;
    }
    
    /**
     * 获取计算结果
     * @return 计算结果
     */
    public int getResult() {
        return result;
    }
    
    /**
     * 重写toString方法
     * @return 算式字符串
     */
    @Override
    public String toString() {
        return getExpression();
    }
}